UNRAID性能优化一:docker容器挂载目录

您所在的位置:网站首页 nas 挂载到本地 UNRAID性能优化一:docker容器挂载目录

UNRAID性能优化一:docker容器挂载目录

2023-05-06 10:46| 来源: 网络整理| 查看: 265

作者:核子猫

注:本文章适用于在UNRAID上以任何形式创建的docker容器,并不仅限于docker-compose、docker cli😊

玩unraid的朋友应该都知道,把appdata、domains、system等共享文件夹放入由ssd硬盘组成的缓存内能极大的提高unraid的性能,本文将会探讨一下通过修改容器挂载目录的方式,进一步提高容器app表现。减少CPu损耗。

这里我们先模拟一个unraid环境,由多块硬盘组成的阵列设备(Array Devices),一块SSD(也可以是多块)组成的缓存池设备(Pool Devices),名称为cache。你的实际环境可能有多个缓存,阵列里还有校验盘,但道理都是通用的。

以配置一个aria2容器举例,在配置时,一般会将容器的配置等映射到本地存储,比如在宿主机上建立对应容器的config文件夹,此时文件夹有 2 种合法的路径映射:

映射方式1:/mnt/cache/appdata/aria2/config    ->    直接挂载在/mnt下对应的磁盘空间内

映射方式2:/mnt/user/appdata/aria2/config    ->    挂载在由 unraid 系统虚拟映射出来的用户共享空间

/mnt/cache/appdata和/mnt/user/appdata这2个目录下的内容其实是一模一样的:

/mnt/cache/appdata是appdata目录真正所在的位置(我们在上面设置了这个文件夹只使用缓存)

/mnt/user/appdata则是unraid系统在/mnt/user虚拟出来的(可以当作是一个WIN上的快捷方式便于理解)

/mnt/user同时还有其他用户创建的共享文件夹,例如file、downloads、media等等,这些全部都是虚拟出来的(快捷方式),文件夹里面的内容,实际可能存在于阵列设备(Array Devices)中任意一块硬盘,或者缓存池设备(Pool Devices)中,这就是unraid系统的特色功能SHFS,文件可能存在于不同的磁盘上,但是呈现在用户眼里(/mnt/user),都在聚合在同一个文件夹内。(unraid的smb性能表现差,也和SHFS有关)

但SHFS也不是没有代价的,用户或者某个程序在/mnt/user文件夹内的操作,都需要更多的CPU资源,来计算真正应该去哪一块硬盘读取或者写入哪一个文件。

所以,2种路径映射方式哪一种开销最少也就显而易见了,使用/mnt/cache/appdata可以直接操作我们设置的cache磁盘,绕过了unraid的SHFS,避免了这一步的开销。当然对于aria2这样优化的相当好相当轻量级的应用来说,都大差不差,不过一旦你nas跑的应用足够多、应用IO开销大或者CPU性能比较弱的话,则可以考虑修改路径映射,能省则省嘛~

⚠️注意:必须要保证存放 docker 数据的appdata共享文件夹设置为:

否则可能会因为部分文件不在cache磁盘(缓存盘)内,而导致容器启动或运行错误。

对于已经部署了不少docker容器或者appdata打散在多个文件夹内的同学,可以考虑以下方式进行迁移:

停止 Docker 服务

设置cache共享文件夹为Use cache pool (for new files/directories):Only

使用unBALANCE插件,将原appdata文件夹内的数据迁移到 SSD 缓存上

启动 Docker 服务

编辑容器设置,将映射路径设置为/mnt/cache/appdata

最后启动容器

针对下载类的容器应用,配置文件夹当然使用/mnt/cache/appdata来映射。

那么下载的目录呢?我个人是这么设想的:

在unraid上建立共享文件夹downloads

1、如果downloads设置为单一硬盘(Included disk(s):Disk1),那么可以直接映射真实磁盘路径/mnt/disk1/downloads;

2、如果downloads设置包括多块硬盘(Included disk(s):Disk1,Disk2),那么只能用虚拟映射/mnt/user/downloads

其实对于下载用途,可以考虑单独设一块硬盘(无所谓固态或机械)作为下载盘,在缓存池设备中添加为一个单盘‘缓存’,并在容器应用中将下载目的地设置为这个单盘‘缓存’(直接使用真实磁盘路径映射/mnt/single_disk_download_cache),下载完成后使用脚本或下载器自带功能将文件转移至阵列设备中的最后存储文件夹(使用虚拟映射/mnt/user/xxx)。

尤其考虑到如果直接用虚拟路径映射到阵列设备的话,下载的时候CPU一边要算文件具体该往哪里写,一边还要做奇偶校验,对系统的影响应该是比较显著的。

下面是一个docker compose的例子:

参考文档:

https://www.reddit.com/r/unRAID/comments/11jne4q/mntcacheappdata_vs_mntuserappdata_whats_the/

https://forums.unraid.net/topic/97165-smb-performance-tuning/



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3